package cn.hy.机考.part05;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author hy
 * 四十、众数和中位数
 * 众数是指一组数据中出现次数量多的那个数，众数可以是多个 中位数是指把一组数据从小到大排列，最中间的那个数，
 * 如果这组数据的个数是 奇数，那最中间那个就是中位数
 * 如果这组数据的个数为偶数，那就把中间的两个数之和除以 2，所得的结果就是 中位数
 * 查找整型数组中元素的众数并组成一个新的数组，求新数组的中位数
 * 10 11 21 19 21 17 21 16 21 18 16 输出:21
 * 2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4 输出:3
 */
public class Demo40 {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        List<Integer> arr = Arrays.stream(sc.nextLine().split("\\s")).map(Integer::parseInt).collect(Collectors.toList());

        //存储各个元素出现次数
        Map<Integer, Integer> map = new HashMap<>(arr.size());
        for (int i : arr) {
            map.put(i, map.getOrDefault(i, 0) + 1);
        }
        //根据元素出现次数添加众数
        List<Integer> list = new ArrayList<>();
        //定义游标
        int cursor = 0;
        for (Integer key : map.keySet()) {
            Integer count = map.get(key);
            if (count > cursor) {
                //清空list，添加更大的元素， 并替换游标
                list.clear();
                list.add(key);
                cursor = count;
            } else if (count == cursor) { // 多个众数
                list.add(key);
            } else {
                continue;
            }
        }
        //按照从小到大排序
        list.sort((n1, n2) -> n1.compareTo(n2));
        int middleIndex = list.size() / 2;
        if (list.size() % 2 != 0) {
            System.out.println(list.get(middleIndex));
        } else {
            System.out.println(Integer.valueOf((list.get(middleIndex - 1) + list.get(middleIndex)) / 2));
        }
    }
}
